#include "mytcpsocket.h"
#include "protocol.h"
#include "opedb.h"
#include <stdio.h>
#include "mytcpserver.h"
#include <QDir>
#include <QFileInfoList>
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

MyTcpSocket::MyTcpSocket()
{
    connect(this,SIGNAL(readyRead()),this,SLOT(recvMsg()));
    connect(this,SIGNAL(disconnected()),this,SLOT(clientOffline()));
    m_bUpload = false;
    m_pTimer = new QTimer;
    connect(m_pTimer,SIGNAL(timeout()),this,SLOT(sendFileToClient()));
}

QString MyTcpSocket::getName()
{
    return m_strName;
}

void MyTcpSocket::copyDir(QString strSrcDir, QString strDesDir)
{
    QDir dir;
    dir.mkdir(strDesDir);
    dir.setPath(strSrcDir);
    QFileInfoList fileInfoList = dir.entryInfoList();
    QString srcTmp;
    QString desTmp;
    for(int i = 0; i < fileInfoList.size(); i++){
        srcTmp = strSrcDir +'/' + fileInfoList[i].fileName();
        desTmp = strDesDir + '/' + fileInfoList[i].fileName();
        if(fileInfoList[i].isFile())
        {
            QFile::copy(srcTmp,desTmp);
        }
        else if(fileInfoList[i].isDir())
        {
            if(!(fileInfoList[i].fileName() == ".") && !(fileInfoList[i].fileName() == "..")){
                continue;
            }
            copyDir(srcTmp,desTmp);
        }
    }
}

void MyTcpSocket::recvMsg()
{
    QByteArray data = this->readAll();
    qDebug() << "Received data:" << data;
    // 解析JSON
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(data, &error);
    if (error.error != QJsonParseError::NoError) {
        qDebug() << "JSON parse error:" << error.errorString();
        return;
    }
    if(doc.isObject()){
        QJsonObject jsonObj = doc.object();
        QString type = jsonObj["msgType"].toString();
        if(type == "REGISTER"){
            QString username = jsonObj["username"].toString();
            QString password = jsonObj["password"].toString();
            qDebug() << "Register request - Username:" << username << "Password:" << password;
            bool ret = OpeDB::getInstance().handleRedist(username, password);
            if(!ret){
                qDebug() << "注册插入数据库失败！";
            }
            QDir dir;
            ret = dir.mkdir(QString("./userfile/%1").arg(username));
            if(!ret){
                qDebug() << username<<" :创建用户的文件夹失败";
            }
            QJsonObject recvobj;
            recvobj["code"] = 200;
            recvobj["msgType"] = "REGISTER";
            recvobj["msg"] = QString(username + "注册成功！");
            QJsonDocument recvdoc(recvobj);
            this->write(recvdoc.toJson());
        }
        else if(type == "LOGINER"){
            QString username = jsonObj["username"].toString();
            QString password = jsonObj["password"].toString();
            qDebug() << "Loginer request - Username:" << username << "Password:" << password;
            bool ret = OpeDB::getInstance().handleLogin(username, password);
            QJsonObject recvobj;

            if(!ret){
                qDebug() << username<<"登录失败！";
                recvobj["code"] = 400;
                recvobj["msgType"] = "LOGINER";
                recvobj["msg"] = QString(username + "登录失败！");
            }else{
                recvobj["code"] = 200;
                recvobj["msgType"] = "LOGINER";
                recvobj["msg"] = QString(username + "登录成功！");
            }
            QJsonDocument recvdoc(recvobj);
            this->write(recvdoc.toJson());
        }else{

        }
    }
    // if (m_bUpload) {
    //     QByteArray buff = readAll();
    //     m_file.write(buff);
    //     m_iRecved += buff.size();

    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_UPLOAD_DIR_RESPOND;

    //     if (m_iRecved >= m_iTotal) {
    //         m_file.close();
    //         m_bUpload = false;
    //         qDebug()<<"后端已结束！";
    //         memcpy(respdu->caData, UPLOAD_DIR_FINISHED, CADATEMAX);
    //     } else {
    //         memcpy(respdu->caData, UPLOAD_DIR_PROGRESS, CADATEMAX);
    //         QString iRecved = QString::number(m_iRecved);
    //         qDebug()<<iRecved;
    //         memcpy(respdu->caData + CADATEMAX, iRecved.toStdString().c_str(), CADATEMAX);
    //     }

    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu = NULL;
    //     return;
    // }
    // qDebug() << this->bytesAvailable();
    // uint uiPDULen = 0;
    // this->read((char*)&uiPDULen, sizeof(uint));
    // uint uiMsgLen = uiPDULen-sizeof(PDU);
    // PDU *pdu = mkPDU(uiMsgLen);
    // this->read((char*)pdu + sizeof(uint),uiPDULen-sizeof(uint));

    // switch(pdu->uiMsgType){
    //     //登录
    // case MSGTYPE::LOGINER :{
    //     char caName[CADATEMAX]={'\0'};
    //     char caPwd[CADATEMAX]={'\0'};
    //     strncpy(caName, pdu->caData,CADATEMAX);
    //     strncpy(caPwd, pdu->caData + CADATEMAX,CADATEMAX);
    //     bool ret = OpeDB::getInstance().handleLogin(caName, caPwd);
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_LOGIN_RESPOND;

    //     if (ret){
    //         strcpy(respdu->caData, LOGIN_OK);
    //         m_strName = caName;
    //     }else{
    //         strcpy(respdu->caData, LOGIN_FALIED);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    //     //
    // case ENUM_MSG_TYPE_ALL_ONLINE_REQUEST:{
    //     QStringList ret = OpeDB::getInstance().handleAllOnline();
    //     uint uiMsgLen =ret.size()*CADATEMAX;
    //     PDU* respdu = mkPDU(uiMsgLen);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_ALL_ONLINE_RESPOND;
    //     for(int i = 0; i < ret.size(); i++){
    //         memcpy((char*)(respdu->caMsg) + i*CADATEMAX,ret.at(i).toStdString().c_str(),ret.at(i).size());
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_SERACH_USR_REQUEST:
    // {
    //     int ret = OpeDB::getInstance().handleSearchUsr(pdu->caData);
    //     PDU * respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_SERACH_USR_RESPOND;
    //     if(-1 == ret)
    //     {
    //         strcpy(respdu->caData, SEARCH_USR_NO);
    //     }
    //     else if(1 == ret)
    //     {
    //         strcpy(respdu->caData,SEARCH_USR_ONLINE);
    //     }
    //     else if(0 == ret)
    //     {
    //         strcpy(respdu->caData, SEARCH_USR_OFFLINE);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_ADD_FRIEND_REQUEST:
    // {
    //     char caPerName[CADATEMAX] = {'\0'};
    //     char caName[CADATEMAX] = {'\0'};
    //     strncpy(caPerName, pdu->caData,CADATEMAX);
    //     strncpy(caName,pdu->caData + CADATEMAX, CADATEMAX);
    //     int ret = OpeDB::getInstance().handleAddFriend(caPerName, caName);
    //     PDU * respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
    //     if(-1 == ret){
    //         strcpy(respdu->caData, UNKNOW_ERROR);
    //     }
    //     else if(0 == ret){
    //         strcpy(respdu->caData, ADD_FRIEND_OFFINE);
    //     }
    //     else if(1 == ret){
    //         //strcpy(respdu->caData, ADD_FRIEND_OFFINE);
    //         qDebug()<<"直接转发！";

    //         //如果不是好友且在线就直接转发给好友询问！
    //         MyTcpServer::getInstance().resend(caPerName,pdu);
    //         break;
    //     }
    //     else if(2 == ret){
    //         strcpy(respdu->caData, EXISTED_FRIEND);
    //     }
    //     else if(3 == ret){

    //         strcpy(respdu->caData, ADD_FRIEND_ON_EXIST);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_ADD_FRIEND_AGREE:
    // {
    //     char caPerName[CADATEMAX] = {'\0'};
    //     char caName[CADATEMAX] = {'\0'};
    //     strncpy(caPerName, pdu->caData,CADATEMAX);
    //     strncpy(caName,pdu->caData + CADATEMAX, CADATEMAX);
    //     qDebug()<<QString(caPerName)<<QString(caName);
    //     int ret = OpeDB::getInstance().handleAgreeAddFriend(caPerName, caName);
    //     PDU * respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_AGREE;
    //     if(ret == -1){
    //         strcpy(respdu->caData, ADD_USR_fAILED);
    //         //测试
    //         MyTcpServer::getInstance().resend(caPerName,respdu);
    //     }else{
    //         strcpy(respdu->caData, ADD_USR_SUCCESSFUL);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_ADD_FRIEND_REFUSE:
    // {
    //     char caName[CADATEMAX] = {'\0'};
    //     strncpy(caName,pdu->caData, CADATEMAX);
    //     MyTcpServer::getInstance().resend(caName,pdu);
    //     break;
    // }
    // case ENUM_MSG_TYPE_FLUSH_FRIEND_REQUEST:
    // {
    //     char caName[CADATEMAX] = {'\0'};
    //     strncpy(caName, pdu->caData, CADATEMAX);
    //     QStringList ret = OpeDB::getInstance().handleFlushFriend(caName);
    //     uint uiMsgLen = ret.size()*CADATEMAX;
    //     PDU *respdu = mkPDU(uiMsgLen);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_FLUSH_FRIEND_RESPOND;
    //     for(int i = 0; i < ret.size(); i++){
    //         memcpy((char*)(respdu->caMsg) + i*CADATEMAX, ret.at(i).toStdString().c_str(),ret.at(i).size());
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_DELETE_FRIEND_REQUEST:
    // {
    //     char caPerName[CADATEMAX] = {'\0'};
    //     char caName[CADATEMAX] = {'\0'};
    //     strncpy(caPerName, pdu->caData,CADATEMAX);
    //     strncpy(caName,pdu->caData + CADATEMAX, CADATEMAX);
    //     int ret = OpeDB::getInstance().handleDelFriend(caPerName, caName);
    //     PDU* respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_DELETE_FRIEND_RESPOND;
    //     if(ret == -1){
    //         strcpy(respdu->caData, DELETE_FALURE);
    //     }else{
    //         strcpy(respdu->caData, DELETE_SUCCESSFUL);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST:
    // {
    //     char chatName[CADATEMAX] = {'\0'};
    //     strncpy(chatName, pdu->caData+CADATEMAX,CADATEMAX);
    //     qDebug()<<QString(pdu->caData)<<"发给"<<QString(chatName)<<":"<<QString(pdu->caMsg);
    //     MyTcpServer::getInstance().resend(chatName,pdu);
    //     break;
    // }
    // case ENUM_MSG_TYPE_GROUP_CHAT_REQUEST:
    // {
    //     char caName[CADATEMAX] = {'\0'};
    //     strncpy(caName, pdu->caData, CADATEMAX);
    //     QStringList onlineFriend = OpeDB::getInstance().handleFlushFriend(caName);
    //     for(uint i = 0; i < onlineFriend.size(); i++)
    //     {
    //         MyTcpServer::getInstance().resend(onlineFriend.at(i).toStdString().c_str(),pdu);
    //     }
    //     break;
    // }
    // case ENUM_MSG_TYPE_CREATE_DIR_REQUEST:
    // {
    //     QDir dir;
    //     QString strCurPath = QString("./userfile/%1").arg(pdu->caMsg);
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_CREATE_DIR_RESPOND;
    //     if(dir.exists(strCurPath))//当前路径存在
    //     {
    //         char caNewDir[CADATEMAX] = {'\0'};
    //         memcpy(caNewDir, pdu->caData + CADATEMAX, CADATEMAX);
    //         QString StrNewPath =strCurPath + "/"+caNewDir;
    //         if(dir.exists(StrNewPath)) //文件名已经存在
    //         {
    //             strcpy(respdu->caData, CREATE_DIR_NAME_EXIST);
    //         }
    //         else
    //         {
    //             dir.mkdir(StrNewPath);
    //             strcpy(respdu->caData, CREATE_DIR_SUCCESSFUL);
    //         }

    //     }
    //     else{
    //         strcpy(respdu->caData, CREATE_DIR_NO_EXIST);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_FLUSH_FILE_REQUEST :
    // {

    //     QString strCurPath = QString("./userfile/%1").arg(pdu->caMsg);
    //     QDir dir(strCurPath);
    //     QFileInfoList fileInfoList = dir.entryInfoList();
    //     int iFileCount = fileInfoList.size();
    //     PDU *respdu = mkPDU(sizeof(FileInfo)*iFileCount);
    //     FileInfo *pFileInfo = NULL;
    //     respdu->uiMsgType = ENUM_MSG_TYPE_FLUSH_FILE_RESPOND;
    //     QString strFileName;
    //     for(int i = 0; i < iFileCount; i++){
    //         qDebug()<<fileInfoList[i].fileName()
    //                  <<fileInfoList[i].size()
    //                  <<"文件夹："<<fileInfoList[i].isDir()
    //                  <<"文件："<<fileInfoList[i].isFile();

    //         pFileInfo = (FileInfo*)(respdu->caMsg) + i;
    //         QString strFileName = fileInfoList[i].fileName();
    //         // if(QString(".") == strFileName || QString("..") == strFileName){
    //         //     continue;
    //         // }
    //         memcpy(pFileInfo->caFileName, strFileName.toStdString().c_str(), strFileName.size());
    //         if(fileInfoList[i].isFile()){
    //             pFileInfo->isFileType = 1;
    //         }
    //         else if(fileInfoList[i].isDir()){
    //             pFileInfo->isFileType = 0;
    //         }
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_DELETE_DIR_REQUEST :
    // {
    //     char caName[CADATEMAX] = {'\0'};
    //     strcpy(caName, pdu->caData);
    //     char *pPath = new char[pdu->uiMsgLen];
    //     memcpy(pPath, pdu->caMsg, pdu->uiMsgLen);
    //     QString strPath = QString("./userfile/%1/%2").arg(pPath).arg(caName);
    //     QFileInfo fileInfo(strPath);
    //     bool ret = false;
    //     if(fileInfo.isDir())
    //     {
    //         QDir dir;
    //         dir.setPath(strPath);
    //         ret = dir.removeRecursively();
    //     }
    //     else if(fileInfo.isFile())
    //     {
    //         ret = false;

    //     }
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_DELETE_DIR_RESPOND;
    //     if(ret){
    //         memcpy(respdu->caData, DELETE_DIR_OK, CADATEMAX);
    //     }
    //     else
    //     {
    //         memcpy(respdu->caData, DELETE_DIR_FAILED, CADATEMAX);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_RENAME_DIR_REQUEST :
    // {
    //     char caOldName[CADATEMAX] = {'\0'};
    //     char caNewName[CADATEMAX] = {'\0'};
    //     strncpy(caOldName,pdu->caData,CADATEMAX);
    //     strncpy(caNewName,pdu->caData + CADATEMAX,CADATEMAX);
    //     char *pPath = new char[pdu->uiMsgLen];
    //     memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);

    //     QString strOldPath = QString("./userfile/%1/%2").arg(pPath).arg(caOldName);
    //     QString strNewPath = QString("./userfile/%1/%2").arg(pPath).arg(caNewName);

    //     QDir dir;
    //     bool ret = dir.rename(strOldPath,strNewPath);
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_RENAME_DIR_RESPOND;
    //     if(ret){
    //         memcpy(respdu->caData,RENAME_OK,CADATEMAX);
    //     }
    //     else
    //     {
    //         memcpy(respdu->caData,RENAME_FAILED,CADATEMAX);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_ENTER_DIR_REQUEST :
    // {
    //     char caEnterName[CADATEMAX] = {'\0'};
    //     strncpy(caEnterName,pdu->caData,CADATEMAX);
    //     char *pPath = new char[pdu->uiMsgLen];
    //     memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
    //     QString strPath = QString("./userfile/%1/%2").arg(pPath).arg(caEnterName);
    //     QFileInfo fileInfo(strPath);
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_ENTER_DIR_RESPOND;
    //     if(fileInfo.isDir())
    //     {
    //         memcpy(respdu->caData,ENTER_DIR_OK,CADATEMAX);
    //         memcpy(respdu->caData + CADATEMAX,caEnterName,CADATEMAX);
    //     }
    //     else if(fileInfo.isFile())
    //     {
    //         memcpy(respdu->caData,ENTER_DIR_FAILED,CADATEMAX);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_UPLOAD_DIR_REQUEST:
    // {
    //     char caFileName[CADATEMAX] ={'\0'};
    //     qint64 fileSize = 0;
    //     sscanf(pdu->caData, "%s %lld", caFileName, &fileSize);
    //     char *pPath = new char[pdu->uiMsgLen];
    //     memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
    //     m_strName = QString("./userfile/%1/%2").arg(pPath).arg(caFileName);
    //     delete []pPath;
    //     pPath = NULL;
    //     m_file.setFileName(m_strName);
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_UPLOAD_DIR_RESPOND;
    //     //以只写的方式打开文件，若文件不存在，则会自动创建文件
    //     if(m_file.open(QIODevice::WriteOnly))
    //     {
    //         m_bUpload= true;
    //         m_iTotal = fileSize;
    //         m_iRecved = 0;
    //         memcpy(respdu->caData, UPLOAD_DIR_CREATE_OK,CADATEMAX);
    //         qDebug()<<m_bUpload<<m_iTotal<<m_file.fileName();
    //     }else{
    //         memcpy(respdu->caData, UPLOAD_DIR_CREATE_FAILED,CADATEMAX);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_DELETE_FILE_REQUEST:
    // {
    //     char caName[CADATEMAX] = {'\0'};
    //     strcpy(caName, pdu->caData);
    //     char *pPath = new char[pdu->uiMsgLen];
    //     memcpy(pPath, pdu->caMsg, pdu->uiMsgLen);
    //     QString strPath = QString("./userfile/%1/%2").arg(pPath).arg(caName);
    //     QFileInfo fileInfo(strPath);
    //     bool ret = false;
    //     if(fileInfo.isDir())
    //     {
    //         ret = false;
    //     }
    //     else if(fileInfo.isFile())
    //     {
    //         QDir dir;
    //         ret = dir.remove(strPath);
    //     }
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_DELETE_FILE_RESPOND;
    //     if(ret){
    //         memcpy(respdu->caData, DELETE_FILE_OK, CADATEMAX);
    //     }
    //     else
    //     {
    //         memcpy(respdu->caData, DELETE_FILE_FAILED, CADATEMAX);
    //     }
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_DOWNLOAD_DIR_REQUEST:
    // {
    //     char caFileName[CADATEMAX] ={'\0'};
    //     strcpy(caFileName,pdu->caData);
    //     char *pPath = new char[pdu->uiMsgLen];
    //     memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
    //     QString strPath = QString("./userfile/%1/%2").arg(pPath).arg(caFileName);
    //     //QString fullPath = QCoreApplication::applicationDirPath() + QString("/userfile/%1/%2").arg(pPath).arg(caFileName);
    //     delete []pPath;
    //     pPath = NULL;
    //     QFileInfo fileInfo(strPath);
    //     qint64 fileSize = fileInfo.size();
    //     qDebug()<<strPath<<fileSize;
    //     m_strCurFile = strPath;
    //     // QFile file(fullPath);
    //     // m_file.setFileName(fullPath);
    //     // if(m_file.open(QIODevice::ReadOnly)){
    //     //     qDebug() << "打开文件失败：" << m_file.errorString();
    //     //     return;
    //     // }
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_DOWNLOAD_DIR_RESPOND;
    //     sprintf(respdu->caData,"%s %lld",caFileName,fileSize);
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;

    //     m_pTimer->start(1000);
    //     break;
    // }
    // case ENUM_MSG_TYPE_SHARE_FILE_REQUEST:
    // {
    //     char caSendName[CADATEMAX] = {'\0'};
    //     int num = 0;
    //     sscanf(pdu->caData, "%s%d",caSendName, &num);
    //     int size = num * CADATEMAX;
    //     PDU *respdu = mkPDU(pdu->uiMsgLen - size);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_SHARE_FILE_NOTE;
    //     strcpy(respdu->caData,caSendName);
    //     memcpy(respdu->caMsg, pdu->caMsg + size, pdu->uiMsgLen - size);
    //     char caRecvName[CADATEMAX] = {'\0'};
    //     for(int i = 0; i < num; i++){
    //         memcpy(caRecvName, pdu->caMsg + i*CADATEMAX, CADATEMAX);
    //         MyTcpServer::getInstance().resend(caRecvName,respdu);
    //     }
    //     free(respdu);
    //     respdu=NULL;

    //     respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_SHARE_FILE_RESPOND;
    //     strcpy(respdu->caData,"share file ok");
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // case ENUM_MSG_TYPE_SHARE_FILE_NOTE_RESPOND:
    // {
    //     QString strRecvPath = QString("./userfile/%1").arg(pdu->caData);
    //     QString strShareFilePath = QString("./userfile/%1").arg(pdu->caMsg);
    //     int index = strShareFilePath.lastIndexOf('/');
    //     QString strFileName = strShareFilePath.right(strShareFilePath.size() - index - 2);
    //     strRecvPath = strRecvPath + "/" + strFileName;
    //     QFileInfo fileInfo(strShareFilePath);
    //     if(fileInfo.isFile())
    //     {
    //         QFile::copy(strShareFilePath,strRecvPath);
    //     }
    //     else if(fileInfo.isDir())
    //     {
    //         if(!(fileInfo.fileName() == ".") && !(fileInfo.fileName() == "..")){
    //             copyDir(strShareFilePath,strRecvPath);
    //         }

    //     }
    //     break;
    // }
    // case ENUM_MSG_TYPE_MOVE_FILE_REQUEST:
    // {
    //     char caFileName[CADATEMAX] = {'\0'};
    //     int srcLen = 0;
    //     int destLen = 0;
    //     sscanf(pdu->caData,"%d%d%s",&srcLen, &destLen, caFileName);
    //     char *pSrcPath = new char[srcLen + 1];
    //     char *pDestPath = new char[destLen + 1];
    //     memcpy(pSrcPath, pdu->caMsg, srcLen + 1);
    //     memcpy(pDestPath, pdu->caMsg + srcLen+ 1, destLen + 1);
    //     QString strSrcPath = "./userfile/" + QString(pSrcPath);
    //     QString strDestPath = "./userfile/" + QString(pDestPath);
    //     PDU *respdu = mkPDU(0);
    //     respdu->uiMsgType = ENUM_MSG_TYPE_MOVE_FILE_RESPOND;
    //     qDebug()<<strSrcPath;
    //     qDebug()<<strDestPath;
    //     QFileInfo fileInfo(strDestPath);
    //     if(fileInfo.isDir())
    //     {
    //         bool ret = QFile::copy(strSrcPath,strDestPath + '/'  + QString(caFileName));
    //         if(ret)
    //         {
    //             strcpy(respdu->caData,"move successful");
    //         }
    //         else{
    //             strcpy(respdu->caData,"move failed");
    //         }
    //     }
    //     else if(fileInfo.isFile())
    //     {
    //         strcpy(respdu->caData,"目标不是一个文件夹");
    //     }
    //     delete[] pSrcPath;
    //     delete[] pDestPath;
    //     write((char*)respdu, respdu->uiPDULen);
    //     free(respdu);
    //     respdu=NULL;
    //     break;
    // }
    // default:
    //     break;
    // }
    // free(pdu);
    // pdu=NULL;
}

void MyTcpSocket::clientOffline()
{
    OpeDB::getInstance().handleOffline(m_strName.toStdString().c_str());
    emit offline(this);
}

void MyTcpSocket::sendFileToClient()
{
    QFile file(m_strCurFile);

    if (!file.exists()) {
        qDebug() << "文件不存在：" << m_strCurFile;
        return;
    }
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "文件打开失败：" << file.errorString();
        return;
    }

    qDebug() << "开始发送文件：" << m_strCurFile;

    char buffer[4096];
    while (!file.atEnd()) {
        qint64 bytesRead = file.read(buffer, sizeof(buffer));
        if (bytesRead > 0) {
            write(buffer, bytesRead);
        } else {
            qDebug() << "读取失败：" << file.errorString();
            break;
        }
    }

    file.close();
    qDebug() << "文件发送完毕";
}
